//code UTF-8

package classes;

import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;

import utilitarios.EventoFormater;

/**
 * UFCG - CEEI - DSC Disciplina: Sistema de Informacao I. Professor: Hyggo
 * Almeida.
 * 
 * Projeto Alocador de Salas.
 * 
 * Pacote classes Classe Evento
 * 
 * Classe que cria um Evento que sera alocado em alguma sala, parametros
 * necessarios para criacao: identificador, nome, inicio, fim, area, contato.
 * parametro opicional:numero de repeticoes.
 * 
 * @author Grupo 6.
 * @version 1.0.0
 * 
 */
public class Evento implements Serializable {

	private static final long serialVersionUID = 1L;

	private boolean alocado = false;
	private String id_ev, nome_ev, inicio_ev, fim_ev, area_ev, contato_ev;
	private int rep_ev;

	private Calendar inicio = Calendar.getInstance();
	private Calendar fim = Calendar.getInstance();
	protected SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

	/**
	 * Construtor Completo (necessita do numero de repeticoes).
	 * 
	 * @param identificador
	 *            -> id do evento.
	 * @param nome
	 *            -> nome do evento.
	 * @param inicio
	 *            -> data e hora do inicio do evento.
	 * @param fim
	 *            -> data e hora do fim do evento.
	 * @param area
	 *            -> area a qual o evento pertence.
	 * @param contato
	 *            -> pessoa responsavel pelo evento.
	 * @param repeticoes
	 *            -> numero de repeticoes do evento.
	 * @throws Exception
	 *             -> caso algum atributo esteja invalido ou os intervalos entre
	 *             as datas nao estejam corretos.
	 */
	public Evento(String identificador, String nome, String inicio, String fim,
			String area, String contato, int repeticoes) throws Exception {
		if (repeticoes < 0)
			throw new Exception("Atributo invalido.");
		if(!EventoFormater.checkNome(nome)
				|| !EventoFormater.verificaLetras(contato)
				|| !EventoFormater.verificaLetras(area)
				|| !EventoFormater.verificaAreaEv(area))
			throw new Exception("Atributo invalido.");
		if (!EventoFormater.checkIDEvento(identificador))
			throw new Exception("Identificacao Invalida");
		if (!EventoFormater.verificaDataHora(inicio, fim))
			throw new Exception("Intervalo de datas invalido.");

		this.id_ev = identificador;
		this.nome_ev = nome;
		this.inicio = (GregorianCalendar) GregorianCalendar.getInstance();
		this.fim = (GregorianCalendar) GregorianCalendar.getInstance();
		this.inicio_ev = inicio;
		this.fim_ev = fim;
		this.area_ev = area;
		this.contato_ev = contato;
		this.rep_ev = repeticoes;
		this.inicio.setTime(sdf.parse(inicio_ev.substring(0, 10)));
		this.fim.setTime(sdf.parse(inicio_ev.substring(0, 10)));

	}

	/**
	 * Construtor Default (nao necessita do numero de repeticoes)
	 * 
	 * @param identificador
	 *            -> id do evento.
	 * @param nome
	 *            -> nome do evento.
	 * @param inicio
	 *            -> data e hora do inicio do evento.
	 * @param fim
	 *            -> data e hora do fim do evento.
	 * @param area
	 *            -> area a qual o evento pertence.
	 * @param contato
	 *            -> pessoa responsavel pelo evento.
	 * @throws Exception
	 *             -> caso algum atributo esteja invalido ou os intervalos entre
	 *             as datas nao estejam corretos.
	 */

	public Evento(String identificador, String nome, String inicio, String fim,
			String area, String contato) throws Exception {
		this(identificador, nome, inicio, fim, area, contato, 0);
	}

	/**
	 * Metodo que gera as datas nas quais o evento vai ocorrer se houver
	 * repeticoes.
	 * 
	 * @param data
	 *            -> data na qual o evento ocorre pela primeira vez.
	 * @return datas -> string de todoas as datas em que o evento vai ocorrer.
	 * @throws ParseException
	 *             -> caso a data nao seja valida.
	 */
	public String geraDatas() throws ParseException {
		String data = this.getInicio().substring(0,10);
		ArrayList<String> repeticoes = new ArrayList<String>();
		int dia = Integer.parseInt(data.substring(0, 2));
		int n = Integer.parseInt("11");

		for (int i = 0; i <= n; i++) {
			int dia1 = dia + (7 * i);
			String data1 = dia1 + "/" + data.substring(3, 10);
			inicio.setTime(sdf.parse(data1));
			int novoDia = inicio.get(Calendar.DAY_OF_MONTH);
			int novoMes = inicio.get(Calendar.MONTH) + 1;
			int novoAno = inicio.get(Calendar.YEAR);
			String d = "";
			if (novoDia < 10) {
				d = "0";
			}
			String m = "";
			if (novoMes < 10)
				m = "0";
			repeticoes.add(d + novoDia + "/" + m + novoMes + "/" + novoAno);

		}

		String datas = "";
		for (int i = 0; i < repeticoes.size(); i++) {
			datas += repeticoes.get(i) + " ";
		}
		return datas;
	}

	/**
	 * Metodo que retorna o ID (identificador) do evento.
	 * 
	 * @return ID do evento.
	 */
	public String getID() {
		return id_ev;
	}

	/**
	 * Metodo que retorna o nome do evento.
	 * 
	 * @return nome do evento.
	 */
	public String getNome() {
		return nome_ev;
	}

	/**
	 * Metodo que retorna a qual area o evento pertence.
	 * 
	 * @return area a qual o evento pertence.
	 */
	public String getArea() {
		return area_ev;
	}
	
	public int getNumRep(){
		return this.rep_ev;
	}

	/**
	 * Metodo que retorna o nome do contato responsavel pelo evento.
	 * 
	 * @return nome do contato do evento.
	 */
	public String getContato() {
		return contato_ev;
	}

	/**
	 * Metodo que retorna quando sera o inicio do evento.
	 * 
	 * @return Data e Hora coorespondente ao inicio do evento
	 */
	public String getInicio() {
		return inicio_ev;
	}

	/**
	 * Metodo que retorna quando sera o fim do evento.
	 * 
	 * @return Data e Hora coorespondente ao fim do evento
	 */
	public String getFim() {
		return fim_ev;
	}

	/**
	 * Metodo que retorna o numero de repeticoes de um evento.
	 * 
	 * @return numero de repeticoes do evento.
	 */
	public String getRepeticoes() {
		return "" + rep_ev + "";
	}

	public boolean estaAlocado() {
		return alocado;
	}

	public void setAlocao(boolean ehAlocado) {
		alocado = ehAlocado;
	}

	/**
	 * Metodo que verifica se a data do evento ocorre no fim de semana(Sabado ou
	 * Domingo).
	 * 
	 * @return true -> se o evento ocorre no fim de semana. false -> caso
	 *         contrario.
	 */
	public boolean ocorreEmFDS() {
		int diaSemana = inicio.get(Calendar.DAY_OF_WEEK);
		if (diaSemana == 1 || diaSemana == 7)
			return true;
		return false;
	}

	/**
	 * Metodoto geral que retorna um atributo do evento desejado.
	 * 
	 * @param atributo
	 *            -> deve receber o atributo
	 *            desejado(nome,inicio,fim,area,contato,repeticoes).
	 * 
	 * @return atributo -> se o atributo for valido. null -> caso esse atributo
	 *         nao exista.
	 */
	public String getAtributo(String atributo) {
		if (atributo.toLowerCase().equals("nome"))
			return this.getNome();
		if (atributo.toLowerCase().equals("inicio"))
			return this.getInicio();
		if (atributo.toLowerCase().equals("fim"))
			return this.getFim();
		if (atributo.toLowerCase().equals("area"))
			return this.getArea();
		if (atributo.toLowerCase().equals("contato"))
			return this.getContato();
		if (atributo.toLowerCase().equals("repeticoes"))
			return this.getRepeticoes();

		return null;
	}

	
}
